<?php

namespace Standard\Bundle\ModuleAboutBundle\Services;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Doctrine\ORM\EntityManager;
use Symfony\Component\DependencyInjection\Container;

abstract class AbstractBookFactory {
    abstract function makePHPBook();
    abstract function makeMySQLBook();
}

class OReillyBookFactory extends AbstractBookFactory {
    private $context = "OReilly";
    function makePHPBook() {
        return new OReillyPHPBook;
    }
    function makeMySQLBook() {
        return new OReillyMySQLBook;
    }
}

class SamsBookFactory extends AbstractBookFactory {
    private $context = "Sams";
    function makePHPBook() {
        return new SamsPHPBook;
    }
    function makeMySQLBook() {
        return new SamsMySQLBook;
    }
}

/*
 *   Book classes
 */
abstract class AbstractBook {
    abstract function getAuthor();
    abstract function getTitle();
}

abstract class AbstractMySQLBook extends AbstractBook {
    private $subject = "MySQL";
}

class OReillyMySQLBook extends AbstractMySQLBook {
    private $author;
    private $title;
    function __construct() {
        $this->author = 'George Reese, Randy Jay Yarger, and Tim King';
        $this->title = 'Managing and Using MySQL';
    }
    function getAuthor() {
        return $this->author;
    }
    function getTitle() {
        return $this->title;
    }
}

class SamsMySQLBook extends AbstractMySQLBook {
    private $author;
    private $title;
    function __construct() {
        $this->author = 'Paul Dubois';
        $this->title = 'MySQL, 3rd Edition';
    }
    function getAuthor() {
        return $this->author;
    }
    function getTitle() {
        return $this->title;
    }
}

abstract class AbstractPHPBook extends AbstractBook {
    private $subject = "PHP";
}

class OReillyPHPBook extends AbstractPHPBook {
    private $author;
    private $title;
    private static $oddOrEven = 'odd';
    function __construct()
    {
        //alternate between 2 books
        if ('odd' == self::$oddOrEven) {
            $this->author = 'Rasmus Lerdorf and Kevin Tatroe';
            $this->title = 'Programming PHP';
            self::$oddOrEven = 'even';
        }
        else {
            $this->author = 'David Sklar and Adam Trachtenberg';
            $this->title = 'PHP Cookbook';
            self::$oddOrEven = 'odd';
        }
    }
    function getAuthor() {
        return $this->author;
    }
    function getTitle() {
        return $this->title;
    }
}

class SamsPHPBook extends AbstractPHPBook {
    private $author;
    private $title;
    function __construct() {
        //alternate randomly between 2 books
        mt_srand((double)microtime() * 10000000);
        $rand_num = mt_rand(0, 1);

        if (1 > $rand_num) {
            $this->author = 'George Schlossnagle';
            $this->title = 'Advanced PHP Programming';
        }
        else {
            $this->author = 'Christian Wenz';
            $this->title = 'PHP Phrasebook';
        }
    }
    function getAuthor() {
        return $this->author;
    }
    function getTitle() {
        return $this->title;
    }
}




class Book {
    //put your code here
    //put your code here
    private $templating;
	
    private $router;

    private $em;

    private $container;

    public function __construct(EngineInterface $templating, 
                                UrlGeneratorInterface $router,
                                EntityManager $em, Container $container )
    {
        $this->templating = $templating;
        $this->router = $router;
        $this->em = $em;
        $this->container = $container;

    }
    function testDesginPatten(){
        $this->writeln('BEGIN TESTING ABSTRACT FACTORY PATTERN');
        $this->writeln('');

        $this->writeln('testing OReillyBookFactory');
        $bookFactoryInstance = new OReillyBookFactory;
        $this->testConcreteFactory($bookFactoryInstance);
        $this->writeln('');

        $this->writeln('testing SamsBookFactory');
        $bookFactoryInstance = new SamsBookFactory;
        $this->testConcreteFactory($bookFactoryInstance);

        $this->writeln('');
        $this->writeln("END TESTING ABSTRACT FACTORY PATTERN");
        $this->writeln('');
    }
    
    function testConcreteFactory($bookFactoryInstance)
    {
        $phpBookOne = $bookFactoryInstance->makePHPBook();
        $this->writeln('first php Author: '.$phpBookOne->getAuthor());
        $this->writeln('first php Title: '.$phpBookOne->getTitle());

        $phpBookTwo = $bookFactoryInstance->makePHPBook();
        $this->writeln('second php Author: '.$phpBookTwo->getAuthor());
        $this->writeln('second php Title: '.$phpBookTwo->getTitle());

        $mySqlBook = $bookFactoryInstance->makeMySQLBook();
        $this->writeln('MySQL Author: '.$mySqlBook->getAuthor());
        $this->writeln('MySQL Title: '.$mySqlBook->getTitle());
    }

    function writeln($line_in) {
        echo $line_in."<br/>";
    }
}
